
/**
 * 咖啡机函数的主要入口函数
 * @param {array} drinks 喝水的处理数组
 * @param {string} a 咖啡机的洗干净的时间
 * @param {string} b 挥发所需要的时间
 */
 function main(drinks, a, b) {
  if(drinks == null || !Array.isArray(drinks) || drinks.length ==0) return 0
  drinks.sort((a,b) => a-b)
  return db(drinks, a, b)
}

/**
 * 处理函数
 * @param {array} drinks 喝水的完成的数组 固定
 * @param {string} a ..
 * @param {string} b 
 */
function db(drinks, a, b) {
  let N = drinks.length
  if( a>=b) return drinks[N-1]+b
  let limit = 0
  /*
    1.求出可以看出的最合理的最大值
    2.如果这个a非常的大,就会显得很不合理了.
      - 可能存在很多的空间浪费
  */
  for(let i=0; i<N; i++) {
    limit = Math.max(limit, drinks[i]) + a
  }
  let db = new Array(N).fill(0).map(item => new Array(limit+1).fill(0))
  for(let washline = 0; washline<=limit; washlin++) {
    // 这里到底要干什么东西来着..
    db[N-1][washline] =  Math.min(Math.max(washline, drinks[N-1]) + a, drinks[N-1] + b)
  }
  for(let index = N-2; index>=0; index--) {
    for(let washline  =0 ;washline<=limit; washline++) {
      let p1 = Infinity
      let wash = Maht.max(washline,drinks[index]) +a
      if(wash <= limit) {
        p1 = Math.max(wash, db[index+1][wash])
      }
      let p2 = Math.max(drinks[index] +b ,db[index+1][washline])
      db[index][washline] = Math.min(p1, p2)
    }
  }
  return db[0][0]
}